#!/usr/bin/env bash
# ══════════════════════════════════════════════════════════════════════════════
# FurryOS Gen2.1_v2 Master Build System - "The Developer Edition"
# ══════════════════════════════════════════════════════════════════════════════

BUILD_START_TIME=$(date +%s)
set -e

# --- Path Configuration ---
PROJECT_ROOT="$(cd "$(dirname "$0")" && pwd)"
PARENT_DIR="$(cd "$PROJECT_ROOT/.." && pwd)"
GENERATED="$PARENT_DIR/_generated"
BUILD_DIR="$PARENT_DIR/build"
ISO_DIR="$GENERATED/iso"
WORK_DIR="$GENERATED/work"
ISO_ROOT="$GENERATED/iso-root"
SQUASHFS_ROOT="$WORK_DIR/squashfs-root"
OUTPUT_DIR="$BUILD_DIR/output"

# Auto-log
LOG_FILE="build_$(date +%Y%m%d_%H%M%S).log"
exec > >(tee -a "$LOG_FILE") 2>&1

echo "╔════════════════════════════════════════╗"
echo "║   FurryOS Gen2.1_v2 Build System       ║"
echo "╚════════════════════════════════════════╝"

# ═══════════════════════════════════════════════════════════════════
# [Phase 0] Resource Calculation & Cleanup
# ═══════════════════════════════════════════════════════════════════
echo "[Phase 0] Calculating system limits..."
if command -v free >/dev/null 2>&1; then
    AVAIL_GB=$(free --giga | awk '/^Mem:/ {print int($7)}')
    SQUASH_MEM=$((AVAIL_GB * 75 / 100))
    [ "$SQUASH_MEM" -lt 2 ] && SQUASH_MEM=2
    echo "📊 Capping RAM usage at ${SQUASH_MEM}G for safety."
else
    SQUASH_MEM="4"
fi

echo "Selection: C=Clean All, K=Keep (Incremental), D=Keep Base ISO [C]"
read -p "Selection: " -n 1 -r BUILD_MODE
echo ""
case ${BUILD_MODE,,} in
    k ) echo "➡️  KEEP MODE: Skipping destructive cleanup..."; ;;
    d ) sudo umount -l "$SQUASHFS_ROOT" "$ISO_ROOT" 2>/dev/null || true
        sudo rm -rf "$WORK_DIR" "$ISO_ROOT";;
    * ) sudo umount -l "$SQUASHFS_ROOT" "$ISO_ROOT" 2>/dev/null || true
        sudo rm -rf "$BUILD_DIR" "$GENERATED" "$WORK_DIR" "$ISO_ROOT";;
esac
mkdir -p "$OUTPUT_DIR" "$ISO_DIR" "$WORK_DIR" "$ISO_ROOT"

# ═══════════════════════════════════════════════════════════════════
# [Phase 1] Base ISO Handling (SMART EXTRACTION)
# ═══════════════════════════════════════════════════════════════════
ISO_FILE="$ISO_DIR/debian-live-mate-amd64.iso"
ISO_URL="https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/debian-live-13.2.0-amd64-mate.iso"

if [ ! -f "$ISO_FILE" ]; then
    echo "⬇️ Downloading Debian Base (One-time)..."
    curl -L "$ISO_URL" -o "$ISO_FILE"
fi

# SMART SKIP: Only extract if folders are missing OR we aren't in Keep mode
if [[ ${BUILD_MODE,,} == "k" && -d "$ISO_ROOT/live" ]]; then
    echo "✅ ISO Structure already present. Skipping extraction."
else
    echo "[Phase 1.1] Extracting ISO Structure..."
    sudo rm -rf "$ISO_ROOT" && mkdir -p "$ISO_ROOT"
    sudo bsdtar -C "$ISO_ROOT" -xf "$ISO_FILE"
fi

if [[ ${BUILD_MODE,,} == "k" && -d "$SQUASHFS_ROOT/etc" ]]; then
    echo "✅ SquashFS already unpacked. Skipping unsquash."
else
    echo "[Phase 1.2] Extracting Filesystem (SquashFS)..."
    sudo rm -rf "$SQUASHFS_ROOT" && mkdir -p "$SQUASHFS_ROOT"
    sudo unsquashfs -f -d "$SQUASHFS_ROOT" "$ISO_ROOT/live/filesystem.squashfs"
    sudo chown -R "$USER":"$USER" "$SQUASHFS_ROOT"
fi

# ═══════════════════════════════════════════════════════════════════
# [Phase 2] Chroot Configuration & Packages
# ═══════════════════════════════════════════════════════════════════
echo "[Phase 2] Configuring Repositories & Fixing DNS..."
sudo cp /etc/resolv.conf "$SQUASHFS_ROOT/etc/resolv.conf"
mkdir -p "$SQUASHFS_ROOT/etc/apt"
cat > "$SQUASHFS_ROOT/etc/apt/sources.list" << 'EOF'
deb http://deb.debian.org/debian trixie main contrib non-free non-free-firmware
deb http://deb.debian.org/debian-security trixie-security main contrib non-free non-free-firmware
EOF

sudo chroot "$SQUASHFS_ROOT" bash -c "
    export DEBIAN_FRONTEND=noninteractive
    apt-get update -qq
    apt-get install -y -qq vlc geeqie ffmpeg mate-utils fonts-jetbrains-mono p7zip-full
    apt-get clean
"

# ═══════════════════════════════════════════════════════════════════
# [Phase 3-4] Assets & Live-Boot Setup
# ═══════════════════════════════════════════════════════════════════
echo "[Phase 3] Hard-Coding Asset Deployment..."
FURRYOS_SHARE="$SQUASHFS_ROOT/usr/share/furryos"
# Force clean the target and re-copy everything
sudo rm -rf "$FURRYOS_SHARE" && sudo mkdir -p "$FURRYOS_SHARE"

# Using PROJECT_ROOT to ensure we find the payload every time
if [ -d "$PROJECT_ROOT/payload/assets" ]; then
    sudo cp -ra "$PROJECT_ROOT/payload/assets/." "$FURRYOS_SHARE/"
    echo "✅ Assets injected into /usr/share/furryos"
else
    echo "❌ ERROR: Payload folder not found at $PROJECT_ROOT/payload/assets"
    exit 1
fi

echo "[Phase 4] Generating Live-Boot Setup..."
cat > "$SQUASHFS_ROOT/usr/local/bin/furryos-live-setup" << 'EOF'
#!/bin/bash
ASSET_SRC="/usr/share/furryos"
FURRY_HOME="$HOME/FurryOS"
PR="/org/mate/terminal/profiles/default"
mkdir -p "$FURRY_HOME"
rsync -a "$ASSET_SRC/" "$FURRY_HOME/"
chmod -R u+rw "$FURRY_HOME"
xdg-user-dirs-update
gsettings set org.mate.desktop.background picture-filename "$FURRY_HOME/wallpapers/default.jpg"
gsettings set org.mate.desktop.background picture-options 'zoom'
dconf write $PR/use-theme-colors false
dconf write $PR/background-color "'#1A1414'"
dconf write $PR/foreground-color "'#FEE2E2'"
dconf write $PR/font "'JetBrains Mono Medium 13'"
(sleep 3 && paplay "$FURRY_HOME/sounds/startup.ogg") &
EOF
chmod +x "$SQUASHFS_ROOT/usr/local/bin/furryos-live-setup"

# ═══════════════════════════════════════════════════════════════════
# [Phase 5-6] Autostart & Splash
# ═══════════════════════════════════════════════════════════════════
mkdir -p "$SQUASHFS_ROOT/etc/skel/.config/autostart"
cat > "$SQUASHFS_ROOT/etc/skel/.config/autostart/furryos.desktop" << 'EOF'
[Desktop Entry]
Type=Application
Name=FurryOS Setup
Exec=/usr/local/bin/furryos-live-setup
Terminal=false
X-MATE-Autostart-enabled=true
EOF

if [ -f "$FURRYOS_SHARE/splash/splash.png" ]; then
    mkdir -p "$SQUASHFS_ROOT/boot/grub"
    cp "$FURRYOS_SHARE/splash/splash.png" "$SQUASHFS_ROOT/boot/grub/splash.png"
fi

# ═══════════════════════════════════════════════════════════════════
# [Phase 8.5] The Test Drive (FIXED: NO CHECKSUM ERROR)
# ═══════════════════════════════════════════════════════════════════
echo ""
read -p "🚗 Workspace Ready! Launch QEMU Test Drive? [y/N]: " -r TEST_DRIVE
if [[ $TEST_DRIVE =~ ^[Yy]$ ]]; then
    echo "📦 Rapid-Packing for Test (Priority: Low to prevent freeze)..."
    TEST_ISO="$GENERATED/test_drive.iso"
    sudo rm -f "$ISO_ROOT/live/filesystem.squashfs"

    # 1. Faster compression for testing with 'nice' to prevent system freeze
    sudo nice -n 19 ionice -c 3 mksquashfs "$SQUASHFS_ROOT" "$ISO_ROOT/live/filesystem.squashfs" \
        -comp lz4 -noappend -b 256K -info

    echo "💿 Creating Test ISO (Fixing Checksum Records)..."
    # Essential flags: -boot-info-table updates the bootloader with the correct file offsets
    sudo nice -n 19 xorriso -as mkisofs \
        -iso-level 3 -full-iso9660-filenames \
        -volid "TEST_DRIVE" \
        -eltorito-boot isolinux/isolinux.bin -eltorito-catalog isolinux/boot.cat \
        -no-emul-boot -boot-load-size 4 -boot-info-table \
        -output "$TEST_ISO" "$ISO_ROOT" 2>/dev/null

    echo "🚀 Launching VM (High-Res Mode)..."
    # Added 'vga=791' for 1024x768 resolution
    # Added 'zoom-to-fit=on' to make resizing work perfectly
    sudo qemu-system-x86_64 \
        -cdrom "$TEST_ISO" \
        -m 1536M -smp 2 -enable-kvm \
        -vga virtio -display gtk,gl=on,zoom-to-fit=on,window-close=vm-shutdown \
        -append "boot=live components quiet nosplash vga=791" \
        -usb -device usb-tablet
    sudo rm -f "$TEST_ISO"
fi

# ═══════════════════════════════════════════════════════════════════
# [Phase 9-10] Packing Final ISO
# ═══════════════════════════════════════════════════════════════════
echo ""
read -p "🚀 Next: [P]ack final ISO or [E]xit? [P]: " -n 1 -r NEXT_STEP
echo ""

if [[ ${NEXT_STEP,,} != "e" ]]; then
    echo "[Phase 9] Repacking SquashFS... (High Compression ☕)"
    sudo rm -f "$ISO_ROOT/live/filesystem.squashfs"
    sudo mksquashfs "$SQUASHFS_ROOT" "$ISO_ROOT/live/filesystem.squashfs" \
        -comp xz -b 1048576 -mem "${SQUASH_MEM}G" -noappend >/dev/null

    echo "[Phase 10] Finalizing bootable ISO..."
    OUTPUT_ISO="$OUTPUT_DIR/furryos-gen2.1-v2.iso"
    sudo xorriso -as mkisofs -iso-level 3 -full-iso9660-filenames \
        -volid "FurryOS" -eltorito-boot isolinux/isolinux.bin \
        -eltorito-catalog isolinux/boot.cat -no-emul-boot -boot-load-size 4 \
        -boot-info-table -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \
        -output "$OUTPUT_ISO" "$ISO_ROOT" 2>/dev/null

    echo "✅ SUCCESS! ISO at: $OUTPUT_ISO"
fi

DURATION=$(($(date +%s) - BUILD_START_TIME))
echo "⏱️ Build Finished: $((DURATION / 60))m $((DURATION % 60))s"
